home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks97 / WarriorsProgress.sit / Warrior’s Progress / source code / Source / Libraries / Integers / Range.h < prev    next >
Text File  |  1997-06-28  |  3KB  |  84 lines

  1. // Range.h
  2.  
  3. #ifndef Range_h
  4. #define Range_h
  5.  
  6. #ifndef Assert_h
  7. #include "Assert.h"
  8. #endif
  9.  
  10. template < class Value >
  11. class Range
  12.   {
  13.     typedef Range<Value> RangeType;
  14.     
  15.     private:
  16.         Value start;
  17.         Value end;
  18.     
  19.     public:
  20.         Range( Value v )                : start( v ), end( v )    {}
  21.         Range( Value s, Value e )    : start( s ), end( e )    { Assert( s <= e ); }
  22.         
  23.         const Value& Start() const                            { return start; }
  24.         const Value& End() const                            { return end; }
  25.         
  26.         Value Length() const                                    { return end - start; }
  27.         
  28.         void SetStart( Value v )                            { Assert( v <= end ); start = v; }
  29.         void SetEnd( Value v )                                { Assert( start <= v ); end = v; }
  30.         
  31.         bool IsEmpty() const                                    { return start >= end; }
  32.         
  33.         bool Contains( Value v ) const                    { return start <= v && v < end; }
  34.         bool StrictlyContains( Value v ) const            { return start < v && v < end; }
  35.         bool WeaklyContains( Value v ) const            { return start <= v && v <= end; }
  36.         bool ReverseContains( Value v ) const            { return start < v && v <= end; }
  37.         
  38.         RangeType Head( Value middle ) const            { Assert( middle <= end ); return RangeType( start, middle ); }
  39.         RangeType Tail( Value middle ) const            { Assert( start <= middle ); return RangeType( middle, end ); }
  40.         RangeType Middle( Value s, Value e ) const    { Assert( start <= s ); Assert ( e <= end );  return RangeType( s,e ); }
  41.         
  42.         bool IsHeadOf( const RangeType& r ) const        { return start == r.start && end <= r.end; }
  43.         bool IsTailOf( const RangeType& r ) const        { return start >= r.start && end == r.end; }
  44.         
  45.         void RemoveHead( Value v )                            { Assert( start <= v ); Assert( v <= end ); start = v; }
  46.         void RemoveTail( Value v )                            { Assert( start <= v ); Assert( v <= end ); end = v; }
  47.         void AddHead( Value v )                                { Assert( v <= start ); start = v; }
  48.         void AddTail( Value v )                                { Assert( end <= v ); end = v; }
  49.         
  50.         void RemoveHead( const RangeType& r )            { Assert( start == r.start ); Assert( r.end <= end ); start = r.end; }
  51.         void RemoveTail( const RangeType& r )            { Assert( start <= r.start ); Assert( r.end == end ); end = r.start; }
  52.         void AddHead( const RangeType& r )                { Assert( start == r.end ); start = r.start; }
  53.         void AddTail( const RangeType& r )                { Assert( end == r.start ); end = r.end; }
  54.         
  55.         // These operators order ranges by containment
  56.         bool operator==( const RangeType& r ) const    { return start == r.start && end == r.end; }
  57.         bool operator!=( const RangeType& r ) const    { return start != r.start || end != r.end; }
  58.         bool operator>=( const RangeType& r ) const    { return start <= r.start && end >= r.end; }
  59.         bool operator<=( const RangeType& r ) const    { return start >= r.start && end <= r.end; }
  60.         bool operator<( const RangeType& r ) const    { return *this <= r && *this != r; }
  61.         bool operator>( const RangeType& r ) const    { return *this >= r && *this != r; }
  62.         
  63.         void operator&=( const RangeType& r );            // intersection
  64.         void operator|=( const RangeType& r );            // union
  65.         RangeType operator&( const RangeType& r ) const;
  66.         RangeType operator|( const RangeType& r ) const;
  67.         
  68.         void ExtendToContain( Value v );
  69.         void ExtendToWeaklyContain( Value v );
  70.         void ExtendToStrictlyContain( Value v );
  71.         void ExtendToReverseContain( Value v );
  72.   };
  73.  
  74. typedef Range<int8> Range8;
  75. typedef Range<uint8> URange8;
  76.  
  77. typedef Range<int16> Range16;
  78. typedef Range<uint16> URange16;
  79.  
  80. typedef Range<int32> Range32;
  81. typedef Range<uint32> URange32;
  82.  
  83. #endif
  84.